#define  _CRT_SECURE_NO_WARNINGS 1
#include"Date.h"

int Date::GetMonthDay(int year, int month)
{
    int inday[13] = { -1,31,29,31,30,31,30,31,31,30,31,30,31 };

    if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) 
    {
        return 28;
    }
    else {
        return inday[month];
    }
}

//日期+=天数
Date& Date::operator+=(int day) 
{
    _day = _day + day;
    while (_day > GetMonthDay(_year, _month))
    {
        _day -= GetMonthDay(_year, _month);
        _month++;
        if (_month == 13)
        {
            _year++;
            _month = 1;
        }
    }
    return *this;
}


//日期+天数
Date Date::operator+(int day)
{
    Date tmp(*this);
    tmp += day;
    return tmp;
}

// 日期-=天数

Date& Date::operator-=(int day) 
{
    _day -= day;
    while (_day <= 0)
    {
        day += GetMonthDay(_year, --_month);
        if (_month == -1)
        {
            _year--;
            _month = 12;
        }
    }
    return *this;
}



// 前置++

Date& Date::operator++() 
{
    *this += 1;
    return *this;

}



// 后置++

Date Date::operator++(int) 
{
    Date tmp(*this);
    *this += 1;
    return tmp;
}



// 后置--

Date Date::operator--(int) 
{
    Date tmp(*this);
    *this -= 1;
    return tmp;

}



// 前置--

Date& Date::operator--() {

    *this -= 1;
    return *this;
}



// >运算符重载

bool Date::operator>(const Date& d) {

    if (_year > d._year)
    {
        return true;
    }
    else if (_year == d._year && _month > d._month)
    {
        return true;
    }
    else if (_year == d._year && _month == d._month && _day > d._day)
    {
        return true;
    }
    else {

        return false;
    }


}



// ==运算符重载

bool Date::operator==(const Date& d) {

    return _year == d._year && _month == d._month && _day == d._day;
}



// >=运算符重载

bool Date::operator >= (const Date& d) {

    return *this > d || *this == d;
}



// <运算符重载

bool Date::operator < (const Date& d) {


    return !(*this >= d);
}



// <=运算符重载

bool Date::operator <= (const Date& d) {

    return !(*this > d);
}



// !=运算符重载

bool Date::operator != (const Date& d) {

    return !(*this == d);
}



// 日期-日期 返回天数
int Date::operator-(const Date& d)
{
    int flag = 1;
    Date max = *this;
    Date min = d;
    if (*this < d)
    {
        max = d;
        min = *this;
        flag = -1;
    }
    int n = 0;
    while (min != max)
    {
        ++min;
        n++;
    }
    return n * flag;
}